package org.tity.commons.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.net.URI;

import org.apache.commons.io.FileUtils;
import org.tity.commons.lang.StringUtil;
import org.tity.commons.log.Logger;
 

/**
 * @author LeeFangJie 
 * 		基于 File 的扩展
 */
public class EasyFile implements Serializable, Comparable<EasyFile> {

	private static final long serialVersionUID = 1717976354826093307L;
	public static final String SEPARATOR = File.separator;

	private File file= null;
	
	/**
	 * @return 获得file对象
	 * */
	public File file()
	{
		return this.file;
	}
	
	public EasyFile() {
		 this.file=new File(".");
	}
	
	/**
	 * @param file  文件
	 * */
	public EasyFile(File file) {
		this.file=file;
	}
 
	/**
	 * @param uri uri地址
	 * */
	public EasyFile(URI uri) {
		this.file=new File(uri);
	}

	/**
	 * @param parent 父级目录
	 * @param child 子级路径
	 * */
	public EasyFile(String parent, String child) {
		this.file=new File(parent, child);
	}

	/**
	 * @param pathname 路径
	 * */
	public EasyFile(String pathname) {
		this.file=new File(pathname);
	}

	/**
	 * @param parent 父级目录
	 * @param child 子级路径
	 * */
	public EasyFile(File parent, String child) {
		this.file=new File(parent, child);
	}

	/**
	 * 设置绝对路径
	 * @param absolutePath 绝对路径
	 * */
	public void setAbsolutePath(String absolutePath)
	{
		this.file=new File(absolutePath);
	}

	/**
	 * 比较是否相等
	 * @param o 比较的文件
	 * */
	@Override
	public int compareTo(EasyFile o) {
		return this.file.compareTo(o.file);
	}
	
	
	/**
	 * 获得扩展名
	 * @return 扩展名
	 * */
	public String getExtName()
	{
		String name=this.file.getName();
		int i=name.lastIndexOf(".");
		if(i==-1) return null;
		return name.substring(i);
	}
	
	/**
	 * 获得文件名
	 * @return 文件名
	 * */
	public String getName()
	{
		return this.file.getName();
	}
	
	/**
	 * 获得不包括扩展名的文件名
	 * @return 不包括扩展名的文件名
	 * */
	public String getShortName()
	{
		String name=this.file.getName();
		int i=name.lastIndexOf(".");
		if(i==-1) return name;
		return name.substring(0,i);
	}
	
	/**
	 * 使当前对象的路径指向参数指定的相对路径
	 * @param rel 相对路径
	 * @return  当前对象
	 * */
	public EasyFile resolve(String rel)
	{
		this.file=new  File(StringUtil.removeLast(this.file.getAbsolutePath(), File.separator) + File.separator + StringUtil.removeFirst(StringUtil.removeFirst(rel,"/"),"\\"));
		return this;
	}
 
	/**
	 * 获得绝对路径
	 * @return 绝对路径
	 * */
	public String getAbsolutePath()
	{
		return this.file.getAbsolutePath();
	}
	
	/**
	 * 是否存在
	 * @return 是否存在
	 * */
	public boolean exists()
	{
		return this.file.exists();
	}
	
	
	/**
	 * 获得上级
	 * @return 是否存在
	 * */
	public EasyFile getParentFile()
	{
		return new EasyFile(this.file.getParentFile()); 
	}
	
	/**
	 * 获得上级,
	 * @return 是否存在
	 * */
	public EasyFile parent()
	{
		return getParentFile();
	}
	
	/**
	 * 获得第一个名称匹配的上级
	 * @param name  文件名
	 * @return 上级文件/目录
	 * */
	public EasyFile getFirstAncestor(String name)
	{
		File p=this.file.getParentFile();
		while(p!=null)
		{
			if(p.getName().equals(name))
			{
				return new EasyFile(p);
			}
			p=p.getParentFile();
		}
		return null;
	}
	
	/**
	 * 删除文件
	 * @return  删除是否成功
	 * */
	public boolean delete()
	{
		return this.file.delete();
	}
	
	/**
	 * 连同所有文件或文件夹
	 * @param contents 是否文件夹中的内容一起删除
	 * @return 是否删除成功
	 * */
	public boolean delete(boolean contents) {
		if (contents) {
			try {
				if (this.file.exists()) {
//					FileUtil.deleteDir(this.file);
					FileUtils.deleteDirectory(this.file);
				}
				return true;
			} catch (IOException e) {
				Logger.error(e);
				return false;
			}
		} else {
			return this.file.delete();
		}

	}

	/**
	 * 获得输出流
	 * 	@return 输出流
	 * @throws Exception  抛出异常
	 * */
	public FileOutputStream getOutputStream() throws Exception {
		return new FileOutputStream(this.file);
	}
	
	/**
	 * 获得输入流
	 * 	@return 输入流
	 * @throws Exception  抛出异常
	 * */
	public FileInputStream getInputStream() throws Exception {
		return new FileInputStream(this.file);
	}

	/**
	 * 获得文本内容
	 * @return 文本内容
	 * @throws Exception  抛出异常
	 * */
	public String getStringContent() throws Exception {
		return FileUtils.readFileToString(file,"UTF-8");
	}
	
	/**
	 * 获得文本内容
	 * @param encoding 编码
	 * @return 文本内容
	 * @throws Exception  抛出异常
	 * */
	public String getStringContent(String encoding) throws Exception {
		return FileUtils.readFileToString(file,encoding);
	}
	
	/**
	 * 创建临时文件到默认目录，临时文件并不会自行消失，类似缓存文件
	 * @param prefix 文件前缀
	 * @param suffix  文件后缀，可包含扩展名
	 * @return EasyFile
	 * @throws Exception  异常
	 * */
	public static EasyFile createTempFile(String prefix,String suffix) throws Exception
	{
		return new EasyFile(File.createTempFile(prefix, suffix));
	}
	
	/**
	 * 创建临时文件到指定目录，临时文件并不会自行消失，类似缓存文件
	 * @param prefix 文件前缀
	 * @param suffix  文件后缀，可包含扩展名
	 * @param dir 指定目录
	 * @return EasyFile
	 * @throws Exception 异常
	 * */
	public static EasyFile createTempFile(String prefix,String suffix,File dir) throws Exception
	{
		return new EasyFile(File.createTempFile(prefix, suffix,dir));
	}
	
	@Override
	public String toString() {
		return this.file.toString();
	}
	
}
